#include "smallsh.h"

// 程序缓冲区和指针
static char inpbuf[MAXBUF], tokbuf[2*MAXBUF], *ptr = inpbuf, *tok = tokbuf;

/**
 * @brief 接收用户输入数组inpbuf，识别输入的参数的类型，将其保存在tokbuf数组中
 * @return int type 返回读入的参数类型
 */ 
int gettok(char* outptr)
{
    int type;
    outptr = tok;

    // 首先去除空白字符
    // for(;(*ptr)==' ';ptr++);
    for(; (*ptr) == ' ' || (*ptr) == '\t'; ptr++); // 空白字符包括空格、制表符和换行符，此处换行符一定是处于最后一个

    *tok++ = *ptr;
    switch (*ptr)
    {
    case '\n':
        type=EOL; // 换行符
        break;

    case '&':
        type=AMPERSAND; // 同时执行另一个程序

    case ';':
        type=SEMICOLON; // 分隔符
    
    default:
        type = ARG; // 程序执行的参数

        while(inarg(*ptr)) *tok++ = *ptr++; //使用tokpuf数组记录命令的参数
    }
    *tok++ = '\0'; // 设置数组的结束符
    return type;
}

/**
 * @brief 接收用户输入，将输入保存到数组inpbuf中
 * @return int count 返回输入的内容的长度或者文件结束符EOF
 */ 
int userin(char* p)
{
    int c, count;

    ptr = inpbuf; // 这有什么用？
    tok = tokbuf;

    printf("%s", p);

    for(count=0; ; ) {
        if( (c=getchar()) == EOF ) { // 遇到文件结束符EOF，结束
            return EOF;
        }

        // 思考错误：
        // 1、忘记数组是有长度限制的
        // 2、对于换行符，应该将其转化为'\0'来存储到char类型的数组中

        // else {
        //     (*ptr) = (char)c;
        //     (*ptr)++;
        //     count++;
        // }


        if(count < MAXBUF) {
            inpbuf[count++] = c;
        }

        if(c == '\n' && count < MAXBUF) { // 遇到换行符，结束
            inpbuf[count++] = '\0'; // 先在第一个if中记录'\n'，再在这个if中设置数组的末尾
            return count;
        }

        // 行的长度>=MAXBUF，且最后一个输入为'\n'，重新输入
        if(count == '\n') {
            printf("smallsh:input line too long\n");
            // 不需要重置inpbuf的内容，下一次for循环可以直接覆盖之前的内容
            count = 0;
            printf("%s", p);
        }

        // 注意，这三个if语句要连起来看
    }
}